|
| Date :.......................... 14 mai 1993 Programme :........................ ZOOL Protection :......... MOT DE PASSE Outils : ...............SOFT-ICE V2.50 Temps passé : ..........15 MINUTES Fichier : ......................................... Société : .....................GREMLINS Divers : ......Confection d'un lançeur. Origine :................................... L.F. Numéro : ..................................214 |
Aucun effort n'est fait pour "cacher" l'endroit de la protection.
Les caractères sont appelés par l'INT 16 SF 00.
Le test de la touche ENTER suit, puis deux mots sont comparés et,
si la réponse est mauvaise on quitte.
Les fichiers ne semblent pas être cryptés mais on ne trouve aucune
trace des chaînes d'octets à modifier !
Je confectionne un lançeur centré sur l'INT 16 sf 00.
Pronfondeur de recherche: 80h.
Au premier essai j'entends les 3 bips fatidiques, signe que mon lançeur
a réussi à supprimer la protection.
Mais stupeur, la protection semble toujours être là. Une erreur de
programmation peut-être ? Je vérifie, mais tout semble correct.
Je lance SOFT-ICE et je déroule mon lançeur au pas à pas. Il trouve
bien le JNZ qu'il remplace par um JMP. Alors quoi ?
Le programme remettrait-il en place le saut juste après l'appel de
l'INT 16 ? Impossible. Aucune instruction ne semble le faire et aucun
CALL n'est appelé entre temps. En examinant attentivement mes pointeurs
SEGMENT:OFFSET je m'aperçois que la valeur du SEGMENT de mon patch
remplacé ne coresspond pas au SEGMENT o se trouve le JNZ à modifier.
Mon programme a donc trouvé un autre 0374 bien avant le patch réel.
En fait, au bout de quatre dépilages! Deux solutions: dépiler 4 fois
en popant sans rien tester ou bien tester un deuxième mot pour être
sûr d'avoir trouvé le bon endroit.
Endroit de la demande des caractères:
CS=10DE
CS:1BAB B400 MOV AH,00
CS:1BAD CD16 INT 16
Test de la touche ENTER:
CS:1BD1 3C0D CMP AL,0D
CS:1BD3 742A JZ 1BFF
Test du code entré ( deux mots ):
CS:1BFF A1941C MOV AX,[1C94]
CS:1C02 8B369B1C MOV SI,[1C9B]
CS:1C06 3B4404 CMP AX,[SI+04]
CS:1C09 7403 JZ 1C0E ; SI 1ER TEST OK --> 1C0E
CS:1C0B E9FBFE JMP 1B09 ; SI PAS OK.
CS:1C0E A0961C MOV AL,[1C96]
CS:1C11 3A4406 CMP AL,[SI+06]
CS:1C14 7403 JZ 1C19 ; SI 2EME TEST OK -> 1C19
CS:1C16 E9F0FE JMP 1B09 ; SI PAS OK.
CS:1C19 E8BE20 CALL 3CDA ; SUITE DU JEU.
CS:1C1C C3 RET
Il suffit donc de forcer le premier test vers 1C19 à l'aide d'un JMP.
Ci-dessous les paramètres du lançeur:
; PATCH POUR LE PROGRAMME ZOOL
; DETOURNEMENT DE L'INT 16 sf 00
;
;******************************************************************************
; ZONE A INITIALISER
adr_ip1 equ 1c09h ; Adresse dont le contenu est à modifier.
; Adresse directe.
anc_val equ 0374h ; Valeur d'origine à rechercher, inversée.
nouv_val equ 0eebh ; Nouvelle valeur inversée: EB0E --> JMP 1C19.
INT_DET equ 16h ; Le numéro de l'INT que l'on veut utiliser.
nb equ 080h ; Nombre de dépilage.
BEEP_TONE equ 440 ; Fréquence de la note.
sous_f equ 00 ; Valeur de la sous-fonction.
;---------------------------- int détournée --------------------------------
int_entry proc far
_int: jmp apres
_SAUVE_SP dw 0,0
apres: push ax
push ds
push bx
push cx
push dx
pushf ; Push flags
cmp ah,sous_f
jnz sort
mov dx,301h
in al,dx
mov word ptr cs:[_SAUVE_SP],sp
mov cx,nb
prochain: pop ds ; Je suis obligé de faire 4 dépilages à la
pop ds ; main car un "hit" est trouvé au quatrième
pop ds ; dépilage... c'est le hasard.
pop ds ; ---------> HIT HIT HIT !
dec cx
jz s
cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche.
jnz prochain
mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch.
xor bx,bx
mov ds,bx
mov bx,word ptr cs:data_9 ; Je remets manuellement
mov ds:[INT_DET*4],bx ; en place le vecteur
mov bx,word ptr cs:data_9+2 ; de l'INT détournée.
mov ds:[INT_DET*4+2],bx
mov dx,301h
in al,dx
.
.
.
;* Sound - Sounds speaker with the following tone and duration:
; Ici la routine sonore qui n'est pas listée car c'est la même pour tous mes
; patchs.
.
.
.
s: mov sp,word ptr cs:[_SAUVE_SP]
sort: popf
pop dx
pop cx
pop bx
pop ds
pop ax
jmp dword ptr cs:data_9
int_entry endp